Graphiques avec ggplot2

Déroulement de la séance

Introduction

Principes élémentaires de ggplot

Travail pratique guidé

Conclusion

Introduction

Pourquoi R ?

Reprendre un langage déjà utilisé

R est utile dans l’analyse et la visualisation

Possibilité de documenter clairement ce qui est fait

Pourquoi ggplot ?

Un package pour visualisations simples et avancées

Intégration dans le tidyverse

Nombreuses extensions et gestion fine des détails

R, erreurs, errances

Peu importe l’expérience, tout le monde fait des erreurs

La différence est la capacité à les résoudre vite et bien


Lire et décrypter le message d’erreur est un bon début !

ggplot()
Error in ggplot(): impossible de trouver la fonction "ggplot"
srt(c(1,2,3))
Error in srt(c(1, 2, 3)): impossible de trouver la fonction "srt"
install.packages(tidyverse)
Error in eval(expr, envir, enclos): objet 'tidyverse' introuvable
read.csv("mon_jeu_de_donnees.csv")
Error in file(file, "rt"): impossible d'ouvrir la connexion

R, erreurs, errances

# Charger la librairie pour ensuite accéder aux fonctions
library(ggplot2)
ggplot()
# Vérifier et rectifier les fautes de frappe
str(c(1,2,3))
# Il faut préciser le nom du package à installer en tant que texte
install.packages("tidyverse")
# Vérifier le chemin d'accès
read.csv("data/mon_jeu_de_donnees.csv")

Si votre console affiche un + et non un > après avoir entré votre commande, c’est qu’un élément (), [], {}, "", '' n’a pas été fermé

S’approprier RStudio - Partie 1

  • Démarrez RStudio, créez un nouveau dossier et nouveau Rproj et ouvrez introduction_ggplot2.Rmd

  • Notez vos version de R (s’affiche au début | 4.2.x et +) et RStudio (Menu Aide > À propos | 2023.03.x)

  • Lisez et effectuez la partie 1. Introduction du RMarkdown

N’oubliez pas d’Appliquer les changements

04:30

Principes élémentaires de ggplot

Pour faire un graphique, il faut 3 éléments :

  • des données
  • des aesthetic mappings (correspondances esthétiques)
  • une couche (layer)


et également la librarie ggplot2

library(tidyverse)

Les données

Maturités gymnasiales du secondaire II, issues de la Statistique des diplômes (SBA) de l’Office Fédéral de la Statistique (état avril 2022)

dmat <- readr::read_csv("data/matus.csv")
head(dmat, n = 8)
# A tibble: 8 × 122
  canton    h_2021 f_2021 langues_anciennes_2021 langue_moderne_2021
  <chr>      <dbl>  <dbl>                  <dbl>               <dbl>
1 Vaud        1101   1455                     46                 291
2 Valais       297    425                     66                 233
3 Genève       731    985                     94                 328
4 Berne        708   1058                     10                 269
5 Fribourg     361    533                     28                 273
6 Neuchâtel    214    312                      6                  60
7 Jura          60     86                      2                  33
8 Tessin       431    704                     70                 187
# ℹ 117 more variables: math_physique_2021 <dbl>, bio_chimie_2021 <dbl>,
#   eco_droit_2021 <dbl>, philo_psycho_2021 <dbl>, arts_visuels_2021 <dbl>,
#   musique_2021 <dbl>, autres_2021 <dbl>, h_2020 <dbl>, f_2020 <dbl>,
#   langues_anciennes_2020 <dbl>, langue_moderne_2020 <dbl>,
#   math_physique_2020 <dbl>, bio_chimie_2020 <dbl>, eco_droit_2020 <dbl>,
#   philo_psycho_2020 <dbl>, arts_visuels_2020 <dbl>, musique_2020 <dbl>,
#   autres_2020 <dbl>, h_2019 <dbl>, f_2019 <dbl>, …

Les données au format tidy

matus_tot <- tidyr::pivot_longer(dmat,
    cols = matches("^[h|f]"),
    names_to = c("annee"),
    names_pattern = "_(\\d{4})",
    names_transform = list(annee = as.integer),
    values_to = "nb_matus") |>
  dplyr::select(canton, annee, nb_matus) |>
  dplyr::group_by(canton, annee) |>
  dplyr::summarise(tot = sum(nb_matus))

head(matus_tot, n=15)
# A tibble: 15 × 3
# Groups:   canton [2]
   canton   annee   tot
   <chr>    <int> <dbl>
 1 Berne     2011  2133
 2 Berne     2012  1962
 3 Berne     2013  1959
 4 Berne     2014  1932
 5 Berne     2015  1943
 6 Berne     2016  1935
 7 Berne     2017  1881
 8 Berne     2018  1862
 9 Berne     2019  1835
10 Berne     2020  1753
11 Berne     2021  1766
12 Fribourg  2011   892
13 Fribourg  2012   853
14 Fribourg  2013   826
15 Fribourg  2014   892

Pour faire un graphique, il faut 3 éléments :

  • des données ✔️
ggplot(data = matus_tot)

Les correspondances esthétiques

Préciser quels éléments des données vont être montrés par quelles propriétés sur le graphique

  • Représenter les cantons par des couleurs différentes
  • Représenter le temps sur l’axe x
  • Représenter le nombre d’habitants par la taille

Les variables visuelles en cartographie

ggplot(data = matus_tot, aes(x = annee))

Pour faire un graphique, il faut 3 éléments :

  • des données ✔️
  • des correspondances esthétiques ✔️
ggplot(data = matus_tot, aes(x = annee, y = tot))

Les couches

Les couches décrivent comment représenter l’information

On peut ajouter une à plusieurs couches à un graphique

Elles sont généralement créées par les fonctions geom_

  • des données ✔️
  • des correspondances esthétiques ✔️
  • une couche ✔️
ggplot(data = matus_tot, aes(x = annee, y = tot)) +
  geom_point()

On peut rajouter des correspondances esthétiques si pertinent

ggplot(data = matus_tot, aes(x = annee, y = tot, color = canton)) +
  geom_point()

Les aes peuvent être définies globalement ou localement

ggplot(data = matus_tot) +
  geom_point(aes(x = annee, y = tot, color = canton))

On peut définir des paramètres de géométrie directement

ggplot(data = matus_tot) +
  geom_point(aes(x = annee, y = tot), size = 3, color = "salmon")

On peut ajouter des géométries facilement

ggplot(data = matus_tot, aes(x = annee, y = tot)) +
  geom_point(aes(color = canton)) +
  geom_line()

Il y a des géométries individuelles et collectives

ggplot(data = matus_tot, aes(x = annee, y = tot, color = canton)) +
  geom_point() +
  geom_line(aes(group = canton))

Tester les geoms - Partie 2

Chargement des librairies et données


Expérimenter avec les geoms usuelles (points, lignes, barres/colonnes, histogrammes et boxplots)


Faire des réglages divers (échelles, couleurs, largeur de bande, etc.)

30:00

Mise en scène

Comme pour les cartes, il faut habiller les graphiques


Ajouter des informations qui permettent de le comprendre


Hiérarchiser et trier les éléments


Éléments qui peuvent être obligatoires ou facultatifs

Titre, axes, et légendes

On utilise généralement la fonction labs() qu’on ajoute au graphique

Dans la fonction, on donne le nom de l’élément qu’on souhaite et le texte à écrire.

labs(title = "Titre")

ggplot(matus_tot, aes(annee, tot, color = canton)) +
  geom_point() +
  geom_line(aes(group = canton)) +
  labs(title = "Maturités gymnasiales obtenues",
       subtitle = "Par canton et année",
       x = "Année",
       y = "Nombre de maturités",
       color = NULL,
       caption = "Source: ©OFS (SBA), 2022")

Thèmes (globaux)

Dans ggplot, les modifications qui ne touchent pas aux données se font dans les thèmes

Il existe plusieurs thèmes prédéfinis (fonctions theme_xxx())


ggplot(matus_tot, aes(annee, tot, color = canton)) +
  geom_point() +
  geom_line(aes(group = canton)) +
  theme_classic()

Thèmes (personnalisation)

Il est possible d’ajuster chaque élément individuellement avec la fonction theme()

Chaque élément est ajusté sous la forme theme(element.name = element_function())

Il y a quatre fonctions d’éléments (text, rectangle, line, blank)

ggplot(matus_tot, aes(annee, tot, color = canton)) +
  geom_line(aes(group = canton)) +
  labs(title = "Ceci est un titre") +
  theme(plot.title = element_text(family = "Century Gothic", size = 25),
        panel.background = element_rect(fill = "yellow"),
        panel.grid.major = element_line(color = "black"),
        axis.title.x = element_blank())

Habillage

Titres, axes et légendes

Thèmes complets

Personnalisation d’éléments

Changement de police

15:00

Complexifier

Jusqu’ici, possibilité de faire des graphiques simples

Le développement est incrémental, un graphique nécessite plusieurs essais avant d’être abouti

Gardez vos versions intermédiaires pour pouvoir y revenir

Petits multiples (facetting)

Avec ggplot, il y a deux fonctions pour obtenir des petits multiples

  • facet_grid(), multiples en fonction de 2 variables
  • facet_wrap(), multiples en fonction d’1 variable

Petits multiples (facetting)

Toujours selon le même principe, il faut définir un graphique de base

À la suite, on ajoute la fonction facet_() qu’on veut utiliser

À l’intérieur, on précise à l’aide d’un tilde (~), “en fonction de” quoi on souhaite réaliser les multiples.


facet_wrap(~ canton)

facet_grid(annee ~ mois), où l’ordre est (lignes ~ colonnes)

facet_wrap()
ggplot(matus_branche_rel, aes(annee, pct_matu*100)) +
  geom_line(aes(color = canton, group = canton)) +
  facet_wrap(~ branche) +
  scale_x_discrete(labels = c("2011","", "","", "", "16","","","","", "21"))

facet_grid()
ggplot(matus_branche_rel_selection, aes(annee, pct_matu*100)) +
  geom_line(aes(color = canton, group = canton), linewidth = 0.8) +
  facet_grid(canton ~ branche) +
  scale_x_discrete(labels = c("2011","", "","", "", "16","","","","", "21")) +
  theme(legend.position = "none")

Mise en valeur (highlighting)

Il ne faut pas hésiter à faciliter la lecture du public cible en mettant en avant certains éléments

La mise en valeur doit être appropriée au but visé (comparer, montrer une tendance,etc.)

Quelles sont les grandes tendances pour le Tessin ?

Quelles sont les grandes tendances pour le Tessin ?

Quelles sont les grandes tendances pour le Tessin ?

Cartographie

À l’aide du package sf (simple features), il est possible de faire des cartes avec ggplot

Il est possible d’utiliser geom_sf() sur des données spatiales (avec une colonne géométrie)

library(sf)
cantons <- st_read("data/map/K4kant20220101gf_ch2007Poly.shp", quiet = T)
lacs <- st_read("data/map/k4seenyyyymmdd11_ch2007Poly.shp", quiet = T)

ggplot() +
  geom_sf(data = cantons, fill = "gray85", color = "white", linewidth = 0.5) +
  geom_sf(data = lacs, fill = "darkGray", color = "darkGray", linewidth = 0.4) +
  coord_sf(datum = NA) +
  labs(title = "Les cantons suisses",
       caption = "© OFS, Themakart, 2023") +
  theme(panel.background = element_blank())

Exporter

Une fois le graphique terminé, il est possible de l’exporter

La fonction ggsave() permet d’exporter le dernier graphique visualisé ou un graphique enregistré dans une variable

Le nom du fichier déterminera l’extension (.svg, .png, etc.)

final <- ggplot(data = matus_tot) +
  geom_point(aes(x = annee, y = tot, color = canton))

ggsave("exemple_export.png", plot = final)


Il est possible de préciser les dimensions (en inches) avec les arguments width et height.

final <- ggplot(data = matus_tot) +
  geom_point(aes(x = annee, y = tot, color = canton))

ggsave("exemple_export.png", plot = final, height = 3, width = 5)

Conclusions

Les graphiques dont on a l’habitude

Les graphiques qu’on peut produire

Des multiples différents

Conclusions

Un graphique, comme une carte, nécessite de la réflexion


Le travail est incrémental et commence par les données


ggplot permet de faire des graphiques simples et complexes selon la même logique

Ressources